package com.yuesystem.controller;

import com.yuesystem.common.BaseContext;
import com.yuesystem.common.R;
import com.yuesystem.entity.User;
import com.yuesystem.service.UserService;
import com.yuesystem.util.QiniuUtils;
import java.io.FileInputStream;
import java.util.UUID;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;


/**
 * 文件上传和下载.
 */
@RestController
@RequestMapping("/common")
@CrossOrigin
@Slf4j
public class CommonController {
  
  @Autowired
  QiniuUtils qiniuUtils;
  
  @Autowired
  private UserService userService;
  
  /**
   * 上传文件.
   *
   * @param file 文件
   * @return 上传结果
   */
  @PostMapping("/upload")
  public R<String> upload(@RequestParam("file") MultipartFile file) {
    //原始文件名称比如 aa.png
    String originalFilename = file.getOriginalFilename();
    //将原始名称修改为：唯一文件名称
    String fileName = UUID.randomUUID() + "."
        + StringUtils.substringAfterLast(originalFilename, ".");
    //上传文件，上传到哪呢？图片服务器七牛云
    //把图片发放到距离图片最近的服务器上，降低我们自身服务器的带宽消耗
    boolean upload = qiniuUtils.upload(file, fileName);
    if (upload) {
      //上传成功
      //存路径到数据库
      log.info(QiniuUtils.url + fileName);
      Long currentId = BaseContext.getCurrentId();
      
      log.info("我正在上传头像，当前的用户是：{}", currentId);
      
      User one = userService.getById(currentId);
      
      log.info("我正在上传头像，修改前的用户信息是:{}", one);
      
      one.setImg(QiniuUtils.url + fileName);
      
      log.info("我正在上传头像，修改后的用户信息是:{}", one);
      
      userService.updateById(one);
      return R.success(fileName);
    }
    return R.error("图片 上传失败！");
  }
  
  /**
   * 文件下载.
   *
   * @param name 文件名
   * @param response 下载结果
   */
  // 上传了文件之后，服务器给前端返回了一个文件名，前端下载展示图片，则需要返回文件名给我，然后把图片写会浏览器
  @GetMapping("/download")
  public void download(String name, HttpServletResponse response) {
    try {
      // 输入流，通过输入流读取文件内容
      FileInputStream fileInputStream = new FileInputStream(QiniuUtils.url + name);
      
      // 输出流，通过输出流将文件写回浏览器
      ServletOutputStream outputStream = response.getOutputStream();
      
      response.setContentType("image/jpeg");
      
      int len = 0;
      byte[] bytes = new byte[1024];
      while ((len = fileInputStream.read(bytes)) != -1) {
        outputStream.write(bytes, 0, len);
        outputStream.flush();
      }
      
      // 关闭资源
      outputStream.close();
      fileInputStream.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
    
  }
  
}

